// 题目链接：https://www.luogu.com.cn/record/208857265

#include <iostream>

using namespace std;

const int K = 20;

int n, k;
int q[K];   // 记录队伍中的每个位置站的人
bool st[K]; // 记录每名学生是否加入了队伍

// pos表示当前要选的学生加入队伍后站的位置
void DFS(int pos)
{
    if (pos > k)
    { // 如果队伍中的人数已经等于k了，则输出队伍中所加入的学生，并直接返回
        for (int i = 1; i <= k; ++i)
        {
            printf("%d ", q[i]);
        }
        printf("\n");

        return;
    }

    for (int i = 1; i <= n; ++i)
    {
        if (!st[i])
        {                 // 学生未加入队伍，才能让其入队
            st[i] = true; // 学生入堆后状态设置为true
            q[pos] = i;   //  当前加入的学生站在队伍的pos位置
            DFS(pos + 1); // 继续选站在队伍下一个位置的学生

            // 恢复环境
            st[i] = false;
            q[pos] = 0;
        }
    }
}

int main()
{
    scanf("%d %d", &n, &k);
    DFS(1);

    return 0;
}